package com.lmf.boot.config;

import com.lmf.boot.bean.Car;
import com.lmf.boot.bean.Pet;
import com.lmf.boot.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

import java.util.concurrent.atomic.AtomicBoolean;

    /**
          1、配置类里面使用@Bean标注在方法上给容器注册组件，默认也是单实例的
        * 2、配置类本身也是组件
        * 3、proxyBeanMethods：代理bean的方法
        *      Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
        *      Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
        *      组件依赖必须使用Full模式默认。其他默认是否Lite模式
     *
        * 4、@Import({User.class, DBHelper.class}):
        *    给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

 *        5. @ConditionalOnBean(name = "tom"):
 *                          满足特定条件创建一个Bean，SpringBoot就是利用这个特性进行自动配置的。
 *                          条件装配：满足Conditional指定的条件，则进行组件注入springboot容器
        */
@Import({User.class,Pet.class})
@Configuration(proxyBeanMethods = true)  //告诉springboot框架这是一个配置类 == 配置文件
@ImportResource("classpath:beans.xml")

/**
 * 读取属性文件的方法二 ： @EnableConfigurationProperties:在配置类中加入这个注解
 *              1、开启Car配置绑定功能
 *              2、把这个Car这个组件自动注册到容器中
 */
@EnableConfigurationProperties(Car.class)
public class Myconfig {


    @Bean("tom")
    public Pet dog(){
        return new Pet("tom");
    }

    /**
     * @Bean("user"): 1.给容器中添加组件。(组件:对象实例)
     *                2.以 "方法名" 作为 "组件的id" ;
     *                3.返回类型就是组件类型;
     *                4.返回的值，就是组件在容器中的实例
     *                5.(""):取别名
     */
    @ConditionalOnBean(name = "tom")
    @Bean(value = "user")
    public User user01(){
        User user=new User("李四",21);
        user.setPet(dog());
        return user;
    }

}
